<?php


namespace app\job;

use think\Exception;
use think\facade\Event;
use think\facade\Hook;
use think\facade\Log;
use think\queue\Job;

class Base
{
    public function fire(Job $job, $data)
    {
        //队列执行之前 事件
        try{
            $is_do = $this->checkNeedDo($job, $data); //验证
            //需要处理
            if($is_do === true)
            {
                $work_result = $this->doWork($data);
                if($work_result !== true){
                    $this->queueLog($data, $job, $work_result);  //记录日志
                };
                $job->delete();
            }else{
                $this->queueLog($data, $job, $is_do);
                $job->delete();
            };

        }catch (\Exception $e){
            $error = $e->getMessage() ?: '';
            $this->queueLog($data, $job, $error);   //记录日志
        }

        //任务重复次数 3
        $num = 3;
        if ($job->attempts() > $num) {
            $this->failed($job->attempts, $data, $job, '此任务已达到重复次数上限:'.$num);
            $job->delete();
        }
        //如果任务执行成功后 记得删除任务，不然这个任务会重复执行，直到达到最大重试次数后失败后，执行failed方法
        $job->delete();
        // 也可以重新发布这个任务
//        $job->release($delay); //$delay为延迟时间
    }



    /**
     * @param $data
     * @param $times
     * @param $msg
     * Desc: 到达失败上限的方法
     * User: 苏鹏
     * Date: 2023/9/14
     * Time: 13:06
     * @return void
     */
    public function failed($data, $job, $error)
    {
        //记录日志
        $this->queueLog($data, $job, $error);
    }

    /**
     * Desc: 验证任务是否被处理过
     * User: 苏鹏
     * Date: 2023/9/14
     * Time: 12:43
     * @return void
     */
    public function checkNeedDo()
    {
        return true;
    }

    /**
     * Desc: 处理任务业务逻辑
     * User: 苏鹏
     * Date: 2023/9/14
     * Time: 12:47
     * @return void
     *
     * 返回值 true 成功，false 失败
     */
    public function doWork($data)
    {

    }

    /**
     * Desc: 记录日志
     * User: 苏鹏
     * Date: 2023/9/15
     * Time: 9:31
     * @return void
     */
    protected function queueLog($data, $job, $error)
    {
        $log_data = [
            'data' => json_encode($data),
            'time' => time(),
            'job' => $job,
            'error' => $error
        ];
        \think\facade\Db::name('queue_log')->insert($log_data);
    }

}
